package cn.neusoft.service.impl;

import cn.neusoft.exception.AppException;
import cn.neusoft.po.CartItem;
import cn.neusoft.service.ICartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.TimeUnit;

@Service
public class CartService implements ICartService {

    @Autowired
    RedisTemplate redisTemplate;

    /**
     * 传递用户的id号  根据id可以区分是哪个用户的购物车
     * @param userId
     * @param newItem
     * @return
     */
    @Override
    public boolean addCart(Integer userId,CartItem newItem) {
        //尝试通过用户id获取购物车(装了CartItem的集合)
        Map<Integer,CartItem> cart = (Map<Integer,CartItem>) redisTemplate.opsForValue().get(userId);
        //判断这个购物车项的集合是否存在  不存在就创建一个新的
        if (cart==null){
            cart = new HashMap<>();
        }
        //使用商品的id获取购物车项
        CartItem cartItem = cart.get(newItem.getProductId());
        //说明之前不存在  没有添加过
        if (cartItem==null){
            newItem.setNumber(1);
            //放入购物车
            cart.put(newItem.getProductId(),newItem);
        }else{
            cartItem.setNumber(cartItem.getNumber()+1);
            cart.put(cartItem.getProductId(),cartItem);
        }
        //存储到redis中
        redisTemplate.opsForValue().set(userId,cart,3, TimeUnit.MINUTES);
        return true;
    }

    /**
     * 获取购物车的集合
     * @param userId
     * @return
     */
    @Override
    public Collection<CartItem> getCart(Integer userId) {
        Map<Integer,CartItem> cart = (Map<Integer,CartItem>) redisTemplate.opsForValue().get(userId);
        if (cart==null){
            throw new AppException(11002,"购物车不存在");
        }
        Collection<CartItem> cartItems = cart.values();
        return cartItems;
    }

    /**
     * 更新购物车
     * @param userId
     * @param items
     * @return
     */
    @Override
    public boolean setCart(Integer userId, List<CartItem> items) {
        Map<Integer,CartItem> cart = new HashMap<>();
        items.forEach(item -> {
            cart.put(item.getProductId(),item);
        });
        redisTemplate.opsForValue().set(userId,cart,3,TimeUnit.MINUTES);
        return true;
    }

}
